<!DOCTYPE html>
<html ng-app="ASMSimulator">
<head>
    <title>Simple 8-bit Assembler Simulator in Javascript</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
    <link rel="stylesheet" href="assets/style.css">
    <script type="text/javascript" src="//use.typekit.net/tor0zlh.js"></script>
    <script type="text/javascript">try{Typekit.load();}catch(e){}</script>
</head>
<body ng-controller="Ctrl">
    <a href="https://github.com/Schweigi/assembler-simulator"><img style="z-index:1001;position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub"></a>
    <nav class="navbar navbar-inverse" role="navigation" style="background-color:#428BCA;border:0px;border-radius:0px;">
        <div class="container">
            <div class="navbar-header">
                <div class="btn-group">
                    <button type="button" class="btn btn-success navbar-btn" ng-click="run()" ng-hide="isRunning"><span class="glyphicon glyphicon-play"></span> Run</button>
                    <button type="button" class="btn btn-default navbar-btn" ng-click="stop()" ng-show="isRunning"><span class="glyphicon glyphicon-stop"></span> Stop</button>
                    <button type="button" class="btn btn-default navbar-btn" ng-click="executeStep()" ng-disabled="isRunning"><span class="glyphicon glyphicon-forward"></span> Step</button>
                </div>
                <button type="button" class="btn btn-default navbar-btn" ng-click="reset()">Reset</button>
            </div>
            <div class="navbar-header navbar-right">
                <a class="navbar-brand" style="color:#FFFFFF">Simple 8-bit Assembler Simulator</a>
            </div>
        </div>
    </nav>
    <div class="container">
        <div class="alert alert-danger" ng-hide="error === ''">{{ error }}</div>
        <div class="row">
            <div class="col-lg-7 col-md-6">
                <div class="panel panel-default">
                    <div class="panel-heading">
                        <h4 class="panel-title">Code <small>(<a href="./instruction-set.html" target="_blank" style="color: #337AB7">Instruction Set</a>)</small></h4>
                    </div>
                    <div class="panel-body">
                        <form role="form">
                            <textarea id="sourceCode"
                                      class="form-control source-code"
                                      style="margin-bottom:5px;"
                                      rows="35"
                                      tab-support
                                      select-line
                                      ng-model="code"></textarea>
                            <button type="button" class="btn btn-default" ng-click="assemble()">Assemble</button>
                        </form>
                    </div>
                </div>
            </div>
            <div class="clearfix visible-xs visible-sm"></div>
            <div class="col-lg-5 col-md-6">
                <div class="panel panel-default">
                    <div class="panel-heading">
                        <h4 class="panel-title">Output</h4>
                    </div>
                    <div class="panel-body source-code">
                        <div style="float:left;" class="output"
                             ng-repeat="m in memory.data | startFrom: outputStartIndex track by $index">
                            <span>{{ getChar(m) }}</span>
                        </div>
                    </div>
                </div>
                <div class="panel panel-default">
                    <div class="panel-heading">
                        <h4 class="panel-title">CPU & Memory</h4>
                    </div>
                    <div class="panel-body">
                        <p class="text-muted">Registers / Flags</p>
                        <table class="table table-condensed table-striped">
                            <thead>
                                <tr>
                                    <th style="text-align:center">A</th>
                                    <th style="text-align:center">B</th>
                                    <th style="text-align:center">C</th>
                                    <th style="text-align:center">D</th>
                                    <th style="text-align:center">IP</th>
                                    <th style="text-align:center">SP</th>
                                    <th style="text-align:center">Z</th>
                                    <th style="text-align:center">C</th>
                                    <th style="text-align:center">F</th>
                                </tr>
                            </thead>
                            <tbody>
                                <tr style="text-align:center;" class="source-code">
                                    <td><div style="margin:auto;" ng-class="displayA && 'marker marker-a'"><small>{{ cpu.gpr[0] | number:displayHex }}</small></div></td>
                                    <td><div style="margin:auto;" ng-class="displayB && 'marker marker-b'"><small>{{ cpu.gpr[1] | number:displayHex }}</small></div></td>
                                    <td><div style="margin:auto;" ng-class="displayC && 'marker marker-c'"><small>{{ cpu.gpr[2] | number:displayHex }}</small></div></td>
                                    <td><div style="margin:auto;" ng-class="displayD && 'marker marker-d'"><small>{{ cpu.gpr[3] | number:displayHex }}</small></div></td>
                                    <td><div style="margin:auto;" class="marker marker-ip"><small>{{ cpu.ip | number:displayHex }}</small></div></td>
                                    <td><div style="margin:auto;" class="marker marker-sp"><small>{{ cpu.sp | number:displayHex }}</small></div></td>
                                    <td><small>{{ cpu.zero | flag }}</small></td>
                                    <td><small>{{ cpu.carry | flag }}</small></td>
                                    <td><small>{{ cpu.fault | flag }}</small></td>
                                </tr>
                            </tbody>
                        </table>
                        <p class="text-muted">RAM</p>
                        <div style="width:29em;" class="source-code">
                            <div class="memory-block"
                                 ng-repeat="m in memory.data track by $index"
                                 ng-class="getMemoryCellCss($index)">
                                 <div ng-class="getMemoryInnerCellCss($index)" ng-switch="isInstruction($index)">
                                     <small ng-switch-default>{{ m | number:displayHex }}</small>
                                     <a ng-switch-when="true" ng-click="jumpToLine($index)">
                                         <small>{{ m | number:displayHex }}</small>
                                     </a>
                                 </div>
                            </div>
                        </div>
                        <p style="margin-top:5px;">
                            <small>
                                <span>Clock speed:</span>
                                <select ng-model="speed" ng-options="item.speed as item.desc for item in speeds"></select>
                                <span style="margin-left:5px;">Instructions:</span>
                                <a ng-click="displayInstr = true" ng-hide="displayInstr">Show</a>
                                <a ng-click="displayInstr = false" ng-show="displayInstr">Hide</a>
                                <span style="margin-left:5px;">View:</span>
                                <a ng-click="displayHex = true" ng-hide="displayHex">Hex</a>
                                <a ng-click="displayHex = false" ng-show="displayHex">Decimal</a>
								<br>
								Register addressing: 
                                <span style="margin-left:5px;">A:</span>
                                <a ng-click="displayA = true" ng-hide="displayA">Show</a>
                                <a ng-click="displayA = false" ng-show="displayA">Hide</a>
                                <span style="margin-left:5px;">B:</span>
                                <a ng-click="displayB = true" ng-hide="displayB">Show</a>
                                <a ng-click="displayB = false" ng-show="displayB">Hide</a>
                                <span style="margin-left:5px;">C:</span>
                                <a ng-click="displayC = true" ng-hide="displayC">Show</a>
                                <a ng-click="displayC = false" ng-show="displayC">Hide</a>
                                <span style="margin-left:5px;">D:</span>
                                <a ng-click="displayD = true" ng-hide="displayD">Show</a>
                                <a ng-click="displayD = false" ng-show="displayD">Hide</a>
                            </small>
                        </p>
                    </div>
                </div>
                <div class="panel panel-default">
                    <div class="panel-heading">
                        <h4 class="panel-title">Labels</h4>
                    </div>
                    <div class="panel-body source-code">
                        <table class="table table-condensed table-striped codelabels">
                            <tr>
                                <th>Name</th>
                                <th>Address</th>
                                <th>Value</th>
                            </tr>
                            <tr ng-repeat="(name, value) in labels" class="codelabel">
                                <td class="codelabel-name">{{ name }}</td>
                                <td class="codelabel-line"><a ng-click="jumpToLine(value)">{{ value | number:displayHex }}</a></td>
                                <td class="codelabel-value">{{ memory.data[value] | number:displayHex }}
                                    <span ng-if="memory.data[value] >= 32 && memory.data[value] <= 126">
                                        ('{{ getChar(memory.data[value]) }}')
                                    </span>
                                </td>
                            </tr>
                        </table>
                    </div>
                </div>
            </div>
        </div>
        <hr style="margin-top:10px;margin-bottom:10px;"/>
        <p><small>by Marco Schweighauser (2015) | MIT License | <a href="https://www.mschweighauser.com/make-your-own-assembler-simulator-in-javascript-part1/" target="_blank">Blog</a></small></p>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js"></script>
    <script src="assets/asmsimulator.js"></script>
</body>
</html>
